package com.douxg.learning.worktest.yxaq;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.jfinal.kit.StrKit;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import lombok.Data;
import lombok.experimental.Accessors;
import org.junit.jupiter.api.Test;

/**
 * @Description
 * @Auther douxg
 * @Date 2021/7/4 17:40
 */
public class VisColumnCreate {
    @Test
    public void run() {
        Engine engine = Engine.create("work");
        engine.setDevMode(true);
        engine.addSharedMethod(new StrKit());
        engine.addSharedObject("strUtil", new StrUtil());

        String templateStr = "INSERT INTO `SSA`.`VIS_COLUMN`(`ID`, `TABLE_ID`, `COLUMNS_MAJOR`, `COLUMNS_INSIDE`, `COLUMNS_MAJOR_TOTAL`, `COLUMNS_INSIDE_TOTAL`, `TYPE`, `REMARK`, `CREATE_TIME`, `COLUMNS_THIRD`, `COLUMNS_THIRD_TOTAL`) VALUES (#(id), '#(tableId)', '#(columnsMajor)', '#(columnsInside)', '#(columnsMajorTotal)', '#(columnsInsideTotal)', #(type), '#(remark)', '0000-00-00 00:00:00', NULL, NULL);";
        String updateTemplate = "update `SSA`.`VIS_COLUMN` set COLUMNS_MAJOR= '#(columnsMajor)',COLUMNS_INSIDE='#(columnsInside)',COLUMNS_MAJOR_TOTAL= '#(columnsMajorTotal)',COLUMNS_INSIDE_TOTAL='#(columnsInsideTotal)' where ID= #(id); ";
        Template templateByString = engine.getTemplateByString(templateStr);
        check(templateByString);
//        hidden(templateByString);
//        alarm(templateByString);
//        event(templateByString);
//        db(templateByString);

    }

    public void check(Template templateByString) {
        new Column().setId(1151).setTableId("taskTable").setRemark("任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;unitNum,检查单位数量;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;taskLeaderName,检查负责人;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度;days,剩余天数")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1155).setTableId("hisTaskTable").setRemark("历史任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;unitNum,检查单位数量;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;taskLeaderName,检查负责人;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1158).setTableId("selfTaskTable").setRemark("自查任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;unitNum,检查单位数量;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度;days,剩余天数")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1157).setTableId("selfHisTaskTable").setRemark("自查历史任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;unitNum,检查单位数量;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1160).setTableId("selfTaskTable3").setRemark("自查任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度;days,剩余天数")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1161).setTableId("selfHisTaskTable3").setRemark("自查历史任务列表")
                .setFieldsDesc("taskId,任务编号;taskName,任务名称;taskStartTime,任务开始时间;taskEndTime,任务结束时间;noticeTypeDesc,通知方式;createTime,创建时间;checkStartTime,检查开始时间;taskStateDesc,任务状态;progress,任务进度")
                .setSubFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1149).setTableId("taskDetailUnitTable").setRemark("任务详情单位列表")
                .setFieldsDesc("unitName,单位名称;unitOwner,企业负责人;unitOwnerPhone,联系电话;unitOwnerEmai,邮箱;state,任务状态;totalScore,任务评分")
                .printResult(templateByString);
        new Column().setId(1150).setTableId("taskDetailCheckItemTable").setRemark("任务详情检查项列表")
                .setFieldsDesc("checkItemName,检查项名称;checkItemType,检查项类别;checkItemDesc,检查项描述;checkNormScore,预设分值")
                .printResult(templateByString);
        new Column().setId(1152).setTableId("unitDetailCheckItemTable").setRemark("企业详情检查项列表")
                .setFieldsDesc("checkItemName,检查项名称;checkItemType,检查项类别;checkItemDesc,检查项描述;isPass,是否通过;checkNormScore,预设分值;checkRealScore,实际得分;scoreDesc,打分描述;resultFileIds,技术文档")
                .printResult(templateByString);
    }

    public void hidden(Template templateByString) {
        Column hdColumn = new Column().setId(1114).setTableId("monitorHiddenTable").setRemark("隐患监测列表")
                .setFieldsDesc("businessName,受害业务系统名称;businessTypeId,受害业务系统类型;unitName,所属单位;unitTradeId,所属行业;unitAreaName,所属区域;unitTypeName,单位类型;num,隐患总数;findTime,监测日期")
                .setSubFieldsDesc("eventName,隐患名称;eventThreeType,隐患类型;riskLevel,隐患风险等级;businessIp,受害业务系统IP;findTime,发现时间;status,处置状态");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(hdColumn)));
        Column hd2Column = new Column().setId(1147).setTableId("monitorHiddenChildTable").setRemark("隐患监测子列表")
                .setFieldsDesc("eventName,隐患名称;eventThreeType,隐患类型;riskLevel,隐患风险等级;businessIp,受害业务系统IP;findTime,发现时间;status,处置状态");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(hd2Column)));
    }

    public void alarm(Template templateByString) {
        Column alarmColumn = new Column().setId(1116).setTableId("monitorAlarmTable").setRemark("告警监测列表")
                .setFieldsDesc("businessName,受害业务系统名称;businessTypeId,受害业务系统类型;unitName,所属单位;unitTradeId,所属行业;unitAreaName,所属区域;unitTypeName,单位类型;num,攻击总数;minTime,开始时间;maxTime,结束时间")
                .setSubFieldsDesc("alarmName,攻击名称;eventThreeType,攻击类型;srcIp,源IP;srcCountry,源国家;srcCity,源城市;attackStage,攻击阶段;riskLevel,风险等级;dstIp,受害业务系统IP;totalSum,日志数量;handleStatus,处置状态;maxTime,攻击时间");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(alarmColumn)));
    }

    public void event(Template templateByString) {
        Column eventColumn = new Column().setId(1115).setTableId("monitorEventTable").setRemark("安全事件监测列表")
                .setFieldsDesc("eventName,事件名称;findTime,发现时间;eventLevel,事件等级;eventType,事件类别;num,攻击数量;businessName,受害业务系统名称;businessTypeId,业务系统类型;unitName,所属单位;unitTradeId,所属行业;unitAreaName,所属区域;unitTypeName,单位类型;eventStatus,处置状态;dealTime,处置时间")
                .setSubFieldsDesc("alarmName,攻击名称;eventThreeType,攻击类型;srcCountry,源国家;srcCity,源城市;attackStage,攻击阶段;riskLevel,风险等级;dstIp,受害业务系统IP;totalSum,日志数量;handleStatus,处置状态;maxTime,攻击时间")
                .printResult(templateByString);
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(eventColumn)));
        Column eventDetailColumn = new Column().setId(1123).setTableId("monitorEventDetailTable").setRemark("安全事件详情列表")
                .setFieldsDesc("alarmName,攻击名称;eventThreeType,攻击类型;srcCountry,源国家;srcCity,源城市;attackStage,攻击阶段;riskLevel,风险等级;dstIp,受害业务系统IP;totalSum,日志数量;handleStatus,处置状态;maxTime,攻击时间");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(eventDetailColumn)));
    }

    public void db(Template templateByString) {
        Column classProdectColumn = new Column().setId(1141).setTableId("classProdectTable").setRemark("等保总览列表")
                .setFieldsDesc("businessName,业务系统名称;classifiedLevel,等保级别;unitName,所属单位;unitAreaName,所属区域;evalutionStat,测评状态;lastTime,上次测评时间;overDay,逾期时间(/天);noticeStat,提醒状态;reportName,检测报告;nextTime,下次测评时间");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(classProdectColumn)));
        Column classProdect2Column = new Column().setId(1142).setTableId("classProdectTable2").setRemark("等保测评列表")
                .setFieldsDesc("businessName,业务系统名称;classifiedLevel,等保级别;unitName,所属单位;unitTradeName,所属行业;unitAreaName,所属区域;evalutionStat,测评状态;lastTime,上次测评时间;evalutionResult,测评结果;overDay,逾期时间(/天);noticeStat,提醒状态;reportName,检测报告;nextTime,下次测评时间");
        System.out.println(templateByString.renderToString(BeanUtil.beanToMap(classProdect2Column)));
    }

    @Data
    @Accessors(chain = true)
    public static class Column {
        private Integer id;
        private String tableId;
        private String remark;
        private String fieldsDesc;
        private String subFieldsDesc;
        private String columnsMajor;
        private String columnsInside;
        private String columnsMajorTotal;
        private String columnsInsideTotal;
        private String type = "0";

        public Column setFieldsDesc(String fieldsDesc) {
            this.columnsMajor = descHandleArray(fieldsDesc);
            this.columnsMajorTotal = descHandleObject(fieldsDesc);
            this.fieldsDesc = fieldsDesc;
            return this;
        }

        public Column setSubFieldsDesc(String subFieldsDesc) {
            this.columnsInside = descHandleArray(subFieldsDesc);
            this.columnsInsideTotal = descHandleObject(subFieldsDesc);
            this.subFieldsDesc = subFieldsDesc;
            return this;
        }

        private String descHandleArray(String descs) {
            if (descs == null) {
                return null;
            }
            String[] split = descs.split(";");
            StringBuilder sb = new StringBuilder("[");
            int i = 0;
            for (String s : split) {
                String[] split1 = s.split(",");
                if (i++ > 0) {
                    sb.append(",");
                }
                sb.append("\"").append(split1[0]).append("\"");
            }
            sb.append("]");
            return sb.toString();
        }

        private String descHandleObject(String descs) {
            if (descs == null) {
                return null;
            }
            StringBuilder sb = new StringBuilder("{");
            String[] split = descs.split(";");
            int i = 0;
            for (String s : split) {
                String[] split1 = s.split(",");
                if (split1.length != 2) {
                    return null;
                }
                if (i++ > 0) {
                    sb.append(",");
                }
                sb.append("\"").append(split1[0]).append("\":\"").append(split1[1]).append("\"");
            }
            sb.append("}");
            return sb.toString();
        }

        public Column printResult(Template templateByString) {
            System.out.println(templateByString.renderToString(BeanUtil.beanToMap(this)));
            return this;
        }
    }
}
